#include "serialport.h"

SerialPort::SerialPort()
{
	fd=open("/dev/ttyUSB0",O_RDWR|O_NOCTTY|O_NDELAY);
}

int SerialPort::open_port()
{
	if (fd<0)
    {
        perror("Can't Open Serial Port");
        return(FALSE);
    }
    // // 恢复串口为阻塞状态
    // if(fcntl(fd, F_SETFL, 0) < 0)
    // {
    //     printf("fcntl failed!\n");
    //     return(FALSE);
    // }
    // else
    // {
    //     printf("fcntl=%d\n",fcntl(fd, F_SETFL,0));
    // }
	return fd;
}



////////////////////////////////////////////////////////////////
/**
 *@brief   获取红蓝方命令
 */

int SerialPort::get_Mode()
{
	int b;
    char *name = ttyname(fd);
    if (name != NULL)printf("device:%s\n",name);
    else printf("tty is null\n");

	if(ioctl(fd,FIONREAD,&b)<0)//看缓存区有多少字节的数据，并将数值存到b中
	{
		printf("ioctl failed, error=%d\n ",errno);
		exit(1);
	}
	read(fd,mode_data,1);
	//cout<<errno<<endl;
	//cout<<b<<endl<<"modedata :"<<endl<<mode_data[0]<<endl;
	
	if(mode_data[0]=='r')
	{
		//cout<<"选择红方"<<endl;
		return 1;
	}
	else if(mode_data[0]=='b')
	{
		//cout<<"选择蓝方"<<endl;
		return 2;
	}
	else if(mode_data[0]=='c')
	{
		//cout<<"关闭自瞄"<<endl;
		return 3;
	}
	//tcflush(fd, TCIOFLUSH);//清空缓冲区的内容
	
	return 0;
}

/**
 *@brief   初始化串口
 */
bool SerialPort::initSerialPort()
{

	if (fd == -1)
	{
        perror(UART_DEVICE);
        return false;
    }

	std::cout << "Opening..." << std::endl;
	
	if(set_Brate()==FALSE)
	{
		printf("Open Error\n");
		exit(0);
	}

	if (set_Bit() == FALSE)
	{
        printf("Open Error\n");
		exit(0);
    }

    printf("Open successed\n");
    return true;
}

/**
 *@brief   设置波特率
 */
int SerialPort::set_Brate()
{

    struct termios Opt;
	tcgetattr(fd, &Opt);
	cfsetispeed(&Opt,B115200);//设置接受和发送的波特率
	cfsetospeed(&Opt,B115200);
	
	tcsetattr(fd, TCSANOW, &Opt);
	tcflush(fd, TCIOFLUSH);
	
	return(TRUE);
    
}

/**
 *@brief   设置串口数据位，停止位和效验位
 */
int SerialPort::set_Bit()
{
    struct termios termios_p;

	if (tcgetattr(fd, &termios_p)  !=  0)
	{
		cout<<errno<<endl;
        perror("SetupSerial 1");
		return (FALSE);
    }

	
    termios_p.c_cflag |= (CLOCAL | CREAD);  //接受数据
	termios_p.c_cflag &= ~CSIZE;//设置数据位数

	termios_p.c_cflag |= CS8;//设置数据位

	termios_p.c_cflag &= ~CSTOPB;//设置停止位
	/*设置无校验位*/
	termios_p.c_cflag &= ~PARENB;
	termios_p.c_iflag &= ~INPCK;
	
    termios_p.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);  /*Input原始输入*/
	
	termios_p.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);
    termios_p.c_iflag &= ~(ICRNL | IGNCR);
    termios_p.c_oflag &= ~OPOST;   /*Output禁用输出处理*/

	termios_p.c_cc[VTIME] =50; 
    termios_p.c_cc[VMIN] = 0; //最小接收字符

	tcflush(fd, TCIFLUSH); //清除输入缓存区
	tcsetattr(fd, TCSANOW, &termios_p); //使设置立即生效

	return (TRUE);
    // switch (databits)
    // {
	// case 7:
	// 	termios_p.c_cflag |= CS7;
	// 	break;

	// case 8:
	// 	termios_p.c_cflag |= CS8;
	// 	break;

	// default:
	// 	fprintf(stderr, "Unsupported data size\n");
	// 	return (FALSE);
    // }

	

    /* 设置停止位*/
    // switch (stopbits)
    // {
	// case 1:
	// 	termios_p.c_cflag &= ~CSTOPB;
	// 	break;

	// case 2:
	// 	termios_p.c_cflag |= CSTOPB;
	// 	break;

	// default:
	// 	fprintf(stderr, "Unsupported stop bits\n");
	// 	return (FALSE);

    // }

}

void SerialPort::TransformData(const VisionData &data)
{
	float f;
	static float f2=3.8;
    Tdata[0]='+';

	unsigned char *p1,*p2;//*p3,*p4;

	p1=(unsigned char *)&f2+3;
	Tdata[1]=*(p1-3);
	Tdata[2]=*(p1-2);
	Tdata[3]=*(p1-1);
	Tdata[4]=*p1;

    p2=(unsigned char *)&data.pitch_angle+3;
	Tdata[5]=*(p2-3);
	Tdata[6]=*(p2-2);
	Tdata[7]=*(p2-1);
	Tdata[8]=*p2;
	
     Tdata[9]='\n';
		f2--;
	memcpy(&f,&Tdata[1],4);
	cout<<f<<endl;
}

//发送数据函数
void SerialPort::send()
{
	int b=write(fd, Tdata, 10);
	cout<<b<<endl;
}

//关闭通讯协议接口
void SerialPort::closePort()
{
    close(fd);
}